﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Company.Core.Attributes
{
    /// <summary>
    /// 扩展IOC容器的注册和获取实例对象，在模块初始化的时候，将程序集中所有标记 ExposedService 的类自动注册和自动获取实例。
    /// 该类包含实例生命周期（默认单例）、是否自动注册、是否以接口形式注册。
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    public class ExposedServiceAttribute : Attribute
    {
        public Lifetime Lifetime { get; set; }

        public bool AutoInitialize { get; set; }

        public Type[] Interfaces { get; set; }

        /// <summary>
        /// 扩展IOC容器的注册和获取实例对象，在模块初始化的时候，将程序集中所有标记 ExposedService 的类自动注册和自动获取实例。
        /// 该类包含实例生命周期（默认单例）、是否自动注册、是否以接口形式注册。
        /// </summary>
        public ExposedServiceAttribute(Lifetime lifetime = Lifetime.Singleton, params Type[] interfaces)
        {
            Lifetime = lifetime;
            Interfaces = interfaces;
        }
    }

    /// <summary>
    /// 生命周期枚举
    /// </summary>
    public enum Lifetime
    {
        /// <summary>
        /// 单例
        /// </summary>
        Singleton,

        /// <summary>
        /// 瞬态
        /// </summary>
        Transient
    }
}
